package com.acceptable.qucun.file.service;

import com.acceptable.qucun.file.entity.CurrentDirectory;
import com.acceptable.qucun.file.entity.FileInfo;
import com.acceptable.qucun.file.entity.template.TemplateFile;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.http.ResponseEntity;
import org.springframework.lang.NonNull;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author 巴斯罗斯·K·赫斯洛利
 * @since 2021-08-29
 */
public interface TemplateFileService extends IService<TemplateFile> {

    // 上传前的文件存在性检测 如果存在其他用户或其他位置存在则直接复制
    Map<String, Object> uploadExistCheck(@NonNull Map<String, String> dataMap,
                                         @NonNull HttpServletRequest request);

    // 单一文件块上传
    String chunkUpload(@NonNull Map<String, String> dataMap,
                       @NonNull byte[] chunk,
                       HttpServletRequest request);

    // 上传前检查剩余空间是否充足
    void checkRestVolume(@NonNull Map<String, String> dataMap);

    // 所有文件块上传后合并
    Map<String, Object> mergeFile(@NonNull Map<String, String> dataMap,
                                  HttpServletRequest request);

    // 查询父目录中已经使用过的空间
    long selectUsedVolume(@NonNull Integer userId,
                          @NonNull Long parentDictId);

    // 创建文件夹
    Map<String, Object> createDict(@NonNull Map<String, String> dataMap);

    // 需要进行文件存在性验证的方法 不存在即异常
    List<FileInfo> selectExistedSingleDictSubFile(@NonNull Integer userId,
                                                  @NonNull Long parentDictId,
                                                  @NonNull Boolean shareStatus);

    // 仅包含文件夹的目录信息
    Map<String, Object> selectExistedSingleDictSubDict(@NonNull Integer userId,
                                                    @NonNull Long parentDictId);

    // 查询逻辑上存在的单一文件夹的信息
    CurrentDirectory selectExistedSingleDictInfo(@NonNull Integer userId,
                                                 @NonNull Long fileId,
                                                 @NonNull Boolean shareStatus);

    // 查询逻辑上存在单一文件的信息
    FileInfo selectExistedSingleFileInfo(@NonNull Integer userId,
                                         @NonNull Long fileId,
                                         @NonNull Boolean shareStatus);

    // 重命名逻辑上存在的单一文件
    Map<String, Object> renameExistedSingleFile(@NonNull Map<String, String> dataMap);

    // 逻辑删除多个文件
    String logicalDeleteExistedMultiFile(@NonNull Map<String, String> dataMap);

    // 复制逻辑上存在且物理上也存在的文件
    String moveExistedMultiFile(@NonNull Map<String, String> dataMap);

    // 移动逻辑上存在且物理上也存在的文件
    String copyExistedMultiFile(@NonNull Map<String, String> dataMap);

    // 下载前检查文件的物理存在性
    Map<String, Object> downloadExistedMultiCheck(@NonNull Map<String, String> dataMap);

    // 完整文件下载 如果是目录则压缩后传输
    ResponseEntity<byte[]> fileEntireDownload(@NonNull Map<String, String> dataMap);

    // 查询指定类型 状态的文件
    Map<String, Object> filterCategory(@NonNull Map<String, String> dataMap);

    // 还原被逻辑删除的文件
    String logicalRecovery(@NonNull Map<String, String> dataMap);

    // 物理删除文件
    String physicalDeleteByVerifyCode(@NonNull Map<String, String> dataMap);

    String physicalDeleteExpiredFile(@NonNull Integer userId);
}
